// SPDX-License-Identifier: GPL-2.0-or-later
/*
 * Copyright 2011 ST-Ericsson AB
 */

/dts-v1/;
#include "ste-db8500.dtsi"
#include "ste-href-ab8500.dtsi"
#include "ste-href-family-pinctrl.dtsi"

/ {
	model = "Calao Systems Snowball platform with device tree";
	compatible = "calaosystems,snowball-a9500", "st-ericsson,u9500";

	memory {
		device_type = "memory";
		reg = <0x00000000 0x20000000>;
	};

	en_3v3_reg: en_3v3 {
		compatible = "regulator-fixed";
		regulator-name = "en-3v3-fixed-supply";
		regulator-min-microvolt = <3300000>;
		regulator-max-microvolt = <3300000>;
		/* AB8500 GPIOs start from 1 - offset 25 is GPIO26. */
		gpio = <&ab8500_gpio 25 0x4>;
		startup-delay-us = <5000>;
		enable-active-high;
	};

	gpio_keys {
		compatible = "gpio-keys";
		#address-cells = <1>;
		#size-cells = <0>;

		button@1 {
			debounce-interval = <50>;
			wakeup-source;
			linux,code = <2>;
			label = "userpb";
			gpios = <&gpio1 0 GPIO_ACTIVE_HIGH>;
		};
		button@2 {
			debounce-interval = <50>;
			wakeup-source;
			linux,code = <3>;
			label = "extkb1";
			gpios = <&gpio4 23 GPIO_ACTIVE_HIGH>;
		};
		button@3 {
			debounce-interval = <50>;
			wakeup-source;
			linux,code = <4>;
			label = "extkb2";
			gpios = <&gpio4 24 GPIO_ACTIVE_HIGH>;
		};
		button@4 {
			debounce-interval = <50>;
			wakeup-source;
			linux,code = <5>;
			label = "extkb3";
			gpios = <&gpio5 1 GPIO_ACTIVE_HIGH>;
		};
		button@5 {
			debounce-interval = <50>;
			wakeup-source;
			linux,code = <6>;
			label = "extkb4";
			gpios = <&gpio5 2 GPIO_ACTIVE_HIGH>;
		};
	};

	leds {
		compatible = "gpio-leds";
		pinctrl-names = "default";
		pinctrl-0 = <&gpioled_snowball_mode>;
		used-led {
			label = "user_led";
			gpios = <&gpio4 14 GPIO_ACTIVE_HIGH>;
			default-state = "on";
			linux,default-trigger = "heartbeat";
		};
	};

	soc {
		/* Name the GPIO muxed rails on the Snowball board */
		gpio@8012e000 {
			/* GPIOs 0 - 31 */
			gpio-line-names = "", "", "", "", "", "", "", "",
				     "", "", "", "", "", "", "", "",
				     "", "", "", "", "", "", "", "",
				     "", "", "", "", "", "", "",
				     "AP_GPIO31";
		};

		gpio@8012e080 {
			/* GPIOs 32 - 63 */
			gpio-line-names = "USR PB", "", "", "", "", "", "", "",
				     "", "", "", "", "", "", "", "",
				     "", "", "", "", "", "", "", "",
				     "", "", "", "", "", "", "", "";
		};

		gpio@8000e000 {
			/* GPIOs 64 - 95 */
			gpio-line-names = "", "", "", "", "AP_GPIO68", "", "", "",
				     "", "", "", "", "", "", "", "",
				     "", "", "", "", "", "", "", "",
				     "", "", "", "", "", "", "", "";
		};

		gpio@8000e100 {
			/* GPIOs 128 - 159 */
			gpio-line-names = "", "", "", "", "", "", "", "",
				     "", "", "", "", "IRQ_LAN", "RSTn_LAN",
				     "USR_LED", "", "", "", "", "", "",
				     "", "", "AP_GPIO151", "AP_GPIO152",
				     "", "", "", "", "", "", "";
		};

		gpio@8000e180 {
			/* GPIOs 160 - 191 */
			gpio-line-names = "", "AP_GPIO161", "AP_GPIO162",
				     "ACCELEROMETER_INT1_RDY",
				     "ACCELEROMETER_INT2", "MAG_DRDY",
				     "GYRO_DRDY", "RSTn_MLC", "RSTn_SLC",
				     "GYRO_INT", "UART_WAKE", "GBF_RESET",
				     "", "", "", "",
				     "", "", "", "", "", "", "", "",
				     "", "", "", "", "", "", "", "";
		};

		gpio@8011e000 {
			/* GPIOs 192 - 223 */
			gpio-line-names = "HDTV_INTn", "", "", "", "HDTV_RST",
				     "", "", "", "", "", "", "", "", "",
				     "", "", "", "", "", "", "", "", "",
				     "WLAN_RESETN", "WLAN_IRQ", "MMC_EN",
				     "MMC_CD", "", "", "", "", "";
		};

		gpio@8011e080 {
			/* GPIOs 224 - 255 */
			gpio-line-names = "", "", "", "", "SD_SEL", "", "", "",
				     "", "", "", "", "", "", "", "",
				     "", "", "", "", "", "", "", "",
				     "", "", "", "", "", "", "", "";
		};

		msp0: msp@80123000 {
			pinctrl-names = "default";
			pinctrl-0 = <&msp0txrxtfstck_a_1_default>;
			status = "okay";
		};

		msp1: msp@80124000 {
			pinctrl-names = "default";
			pinctrl-0 = <&msp1txrx_a_1_default>;
			status = "okay";
		};

		msp2: msp@80117000 {
			pinctrl-names = "default";
			pinctrl-0 = <&msp2_a_1_default>;
		};

		msp3: msp@80125000 {
			status = "okay";
		};

		external-bus@50000000 {
			status = "okay";

			ethernet@0 {
				compatible = "smsc,lan9115";
				reg = <0 0x10000>;
				interrupts = <12 IRQ_TYPE_EDGE_RISING>;
				interrupt-parent = <&gpio4>;
				vdd33a-supply = <&en_3v3_reg>;
				vddvario-supply = <&db8500_vape_reg>;
				pinctrl-names = "default";
				pinctrl-0 = <&eth_snowball_mode>;

				reg-shift = <1>;
				reg-io-width = <2>;
				smsc,force-internal-phy;
				smsc,irq-active-high;
				smsc,irq-push-pull;

				clocks = <&prcc_pclk 3 0>;
			};
		};

		/* ST6G3244ME level translator for 1.8/2.9 V */
		vmmci: regulator-gpio {
			compatible = "regulator-gpio";

			/* GPIO228 SD_SEL */
			gpios = <&gpio7 4 GPIO_ACTIVE_HIGH>;
			/* GPIO217 MMC_EN */
			enable-gpio = <&gpio6 25 GPIO_ACTIVE_HIGH>;
			enable-active-high;

			regulator-min-microvolt = <1800000>;
			regulator-max-microvolt = <2900000>;
			regulator-name = "mmci-reg";
			regulator-type = "voltage";

			startup-delay-us = <100>;

			states = <1800000 0x1
				  2900000 0x0>;
		};

		// External Micro SD slot
		sdi0_per1@80126000 {
			arm,primecell-periphid = <0x10480180>;
			max-frequency = <100000000>;
			bus-width = <4>;
			cap-sd-highspeed;
			cap-mmc-highspeed;
			sd-uhs-sdr12;
			sd-uhs-sdr25;
			/* All direction control is used */
			st,sig-dir-cmd;
			st,sig-dir-dat0;
			st,sig-dir-dat2;
			st,sig-dir-dat31;
			st,sig-pin-fbclk;
			full-pwr-cycle;
			vmmc-supply = <&ab8500_ldo_aux3_reg>;
			vqmmc-supply = <&vmmci>;
			pinctrl-names = "default", "sleep";
			pinctrl-0 = <&mc0_a_1_default &sdi0_default_mode>;
			pinctrl-1 = <&mc0_a_1_sleep>;

			/* GPIO218 MMC_CD */
			cd-gpios  = <&gpio6 26 GPIO_ACTIVE_LOW>;

			status = "okay";
		};

		// WLAN SDIO channel
		sdi1_per2@80118000 {
			arm,primecell-periphid = <0x10480180>;
			max-frequency = <100000000>;
			bus-width = <4>;
			pinctrl-names = "default", "sleep";
			pinctrl-0 = <&mc1_a_1_default>;
			pinctrl-1 = <&mc1_a_1_sleep>;

			status = "okay";
		};

		// Unused PoP eMMC - register and put it to sleep by default */
		sdi2_per3@80005000 {
			arm,primecell-periphid = <0x10480180>;
			pinctrl-names = "default";
			pinctrl-0 = <&mc2_a_1_sleep>;

			status = "okay";
		};

		// On-board eMMC
		sdi4_per2@80114000 {
			arm,primecell-periphid = <0x10480180>;
		        max-frequency = <100000000>;
			bus-width = <8>;
			cap-mmc-highspeed;
			vmmc-supply = <&ab8500_ldo_aux2_reg>;
			pinctrl-names = "default", "sleep";
			pinctrl-0 = <&mc4_a_1_default>;
			pinctrl-1 = <&mc4_a_1_sleep>;

			status = "okay";
		};

		uart@80120000 {
			pinctrl-names = "default", "sleep";
			pinctrl-0 = <&u0_a_1_default>;
			pinctrl-1 = <&u0_a_1_sleep>;
			status = "okay";
		};

		/* This UART is unused and thus left disabled */
		uart@80121000 {
			pinctrl-names = "default", "sleep";
			pinctrl-0 = <&u1rxtx_a_1_default>;
			pinctrl-1 = <&u1rxtx_a_1_sleep>;
		};

		uart@80007000 {
			pinctrl-names = "default", "sleep";
			pinctrl-0 = <&u2rxtx_c_1_default>;
			pinctrl-1 = <&u2rxtx_c_1_sleep>;
			status = "okay";
		};

		i2c@80004000 {
			pinctrl-names = "default","sleep";
			pinctrl-0 = <&i2c0_a_1_default>;
			pinctrl-1 = <&i2c0_a_1_sleep>;
			status = "okay";
		};

		i2c@80122000 {
			pinctrl-names = "default","sleep";
			pinctrl-0 = <&i2c1_b_2_default>;
			pinctrl-1 = <&i2c1_b_2_sleep>;
			status = "okay";
		};

		i2c@80128000 {
			pinctrl-names = "default","sleep";
			pinctrl-0 = <&i2c2_b_2_default>;
			pinctrl-1 = <&i2c2_b_2_sleep>;
			status = "okay";
			lsm303dlh@18 {
				/* Accelerometer */
				compatible = "st,lsm303dlh-accel";
				st,drdy-int-pin = <1>;
				reg = <0x18>;
				vdd-supply = <&ab8500_ldo_aux1_reg>;
				vddio-supply = <&db8500_vsmps2_reg>;
				pinctrl-names = "default";
				pinctrl-0 = <&accel_snowball_mode>;
				interrupt-parent = <&gpio5>;
				interrupts = <3 IRQ_TYPE_EDGE_RISING>, /* INT1 */
					     <4 IRQ_TYPE_EDGE_RISING>; /* INT2 */
			};
			lsm303dlh@1e {
				/* Magnetometer */
				compatible = "st,lsm303dlh-magn";
				reg = <0x1e>;
				vdd-supply = <&ab8500_ldo_aux1_reg>;
				vddio-supply = <&db8500_vsmps2_reg>;
				pinctrl-names = "default";
				pinctrl-0 = <&magneto_snowball_mode>;
				interrupt-parent = <&gpio5>;
				interrupts = <5 IRQ_TYPE_EDGE_RISING>; /* DRDY line */
			};
			l3g4200d@68 {
				/* Gyroscope */
				compatible = "st,l3g4200d-gyro";
				st,drdy-int-pin = <2>;
				reg = <0x68>;
				vdd-supply = <&ab8500_ldo_aux1_reg>;
				vddio-supply = <&db8500_vsmps2_reg>;
				pinctrl-names = "default";
				pinctrl-0 = <&gyro_snowball_mode>;
				interrupt-parent = <&gpio5>;
				interrupts = <6 IRQ_TYPE_EDGE_RISING>, /* DRDY line */
					     <9 IRQ_TYPE_EDGE_RISING>; /* INT1 */
			};
			lsp001wm@5c {
				/* Barometer/pressure sensor */
				compatible = "st,lps001wp-press";
				reg = <0x5c>;
				vdd-supply = <&ab8500_ldo_aux1_reg>;
				vddio-supply = <&db8500_vsmps2_reg>;
			};
		};

		i2c@80110000 {
			pinctrl-names = "default","sleep";
			pinctrl-0 = <&i2c3_c_2_default>;
			pinctrl-1 = <&i2c3_c_2_sleep>;
			status = "okay";
		};

		spi@80002000 {
			pinctrl-names = "default";
			pinctrl-0 = <&ssp0_snowball_mode>;
			status = "okay";
		};

		prcmu@80157000 {
			ab8500 {
				ab8500-gpio {
					/*
					 * AB8500 GPIOs are numbered starting from 1, so the first
					 * index 0 is what in the datasheet is called "GPIO1", and
					 * the second is "GPIO2" and so forth. Confusingly, the
					 * Snowball schematic then names the "GPIO2" line "PM_GPIO1".
					 * while later naming "GPIO4" as "PM_GPIO4".
					 */
					gpio-line-names = "", /* AB8500 GPIO1 */
						     "PM_GPIO1", /* AB8500 GPIO2 */
						     "WLAN_CLK_REQ", /* AB8500 GPIO3 */
						     "PM_GPIO4", /* AB8500 GPIO4 */
						     "", "", "", "", "", "", "", "", "", "", "",
						     "EN_3V6", /* AB8500 GPIO16 */
						     "", "", "", "" ,"", "", "", "", "",
						     "EN_3V3", /* AB8500 GPIO26 */
						     "", "", "", "", "", "", "", "", "", "", "", "", "",
						     "PM_GPIO40", /* AB8500 GPIO40 */
						     "PM_GPIO41", /* AB8500 GPIO41 */
						     "PM_GPIO42"; /* AB8500 GPIO42 */
				};

				ab8500_usb {
					pinctrl-names = "default", "sleep";
					pinctrl-0 = <&usb_a_1_default>;
					pinctrl-1 = <&usb_a_1_sleep>;
				};

				ext_regulators: ab8500-ext-regulators {
					ab8500_ext1_reg: ab8500_ext1 {
						regulator-name = "ab8500-ext-supply1";
					};

					ab8500_ext2_reg_reg: ab8500_ext2 {
						regulator-name = "ab8500-ext-supply2";
					};

					ab8500_ext3_reg_reg: ab8500_ext3 {
						regulator-name = "ab8500-ext-supply3";
					};
				};

				ab8500-regulators {
					ab8500_ldo_aux1_reg: ab8500_ldo_aux1 {
						regulator-name = "V-DISPLAY";
					};

					ab8500_ldo_aux2_reg: ab8500_ldo_aux2 {
						regulator-name = "V-eMMC1";
					};

					ab8500_ldo_aux3_reg: ab8500_ldo_aux3 {
						regulator-name = "V-MMC-SD";
					};

					ab8500_ldo_intcore_reg: ab8500_ldo_intcore {
						regulator-name = "V-INTCORE";
					};

					ab8500_ldo_tvout_reg: ab8500_ldo_tvout {
						regulator-name = "V-TVOUT";
					};

					ab8500_ldo_audio_reg: ab8500_ldo_audio {
						regulator-name = "V-AUD";
					};

					ab8500_ldo_anamic1_reg: ab8500_ldo_anamic1 {
						regulator-name = "V-AMIC1";
					};

					ab8500_ldo_anamic2_reg: ab8500_ldo_anamic2 {
						regulator-name = "V-AMIC2";
					};

					ab8500_ldo_dmic_reg: ab8500_ldo_dmic {
						regulator-name = "V-DMIC";
					};

					ab8500_ldo_ana_reg: ab8500_ldo_ana {
						regulator-name = "V-CSI/DSI";
					};
				};
			};
		};

		pinctrl {
			/*
			 * Set this up using hogs, as time goes by and as seems fit, these
			 * can be moved over to being controlled by respective device.
			 */
			pinctrl-names = "default";
			pinctrl-0 = <&gbf_snowball_mode>,
				  <&wlan_snowball_mode>;

			ethernet {
				/*
				 * Mux in "SM" which is used for the
				 * SMSC911x Ethernet adapter
				 */
				eth_snowball_mode: eth_snowball {
					snowball_mux {
						function = "sm";
						groups = "sm_b_1";
					};
					/* LAN IRQ pin */
					snowball_cfg1 {
						pins = "GPIO140_B11";
						ste,config = <&in_nopull>;
					};
					/* LAN reset pin */
					snowball_cfg2 {
						pins = "GPIO141_C12";
						ste,config = <&gpio_out_hi>;
					};

				};
			};
			sdi0 {
				sdi0_default_mode: sdi0_default {
					snowball_mux {
						function = "mc0";
						/* Add the DAT31 pin even if it is not really used */
						groups = "mc0dat31dir_a_1";
					};
					snowball_cfg1 {
						pins = "GPIO21_AB3"; /* DAT31DIR */
						ste,config = <&out_hi>;
					};
					/* SD card detect GPIO pin, extend default state */
					snowball_cfg2 {
						pins = "GPIO218_AH11";
						ste,config = <&gpio_in_pu>;
					};
					/* VMMCI level-shifter enable */
					snowball_cfg3 {
						pins = "GPIO217_AH12";
						ste,config = <&gpio_out_hi>;
					};
					/* VMMCI level-shifter voltage select */
					snowball_cfg4 {
						pins = "GPIO228_AJ6";
						ste,config = <&gpio_out_hi>;
					};
				};
			};
			ssp0 {
				ssp0_snowball_mode: ssp0_snowball_default {
					snowball_mux {
						function = "ssp0";
						groups = "ssp0_a_1";
					};
					snowball_cfg1 {
						pins = "GPIO144_B13"; /* FRM */
						ste,config = <&gpio_out_hi>;
					};
					snowball_cfg2 {
						pins = "GPIO145_C13"; /* RXD */
						ste,config = <&in_pd>;
					};
					snowball_cfg3 {
						pins =
						"GPIO146_D13", /* TXD */
						"GPIO143_D12"; /* CLK */
						ste,config = <&out_lo>;
					};

				};
			};
			gpio_led {
				gpioled_snowball_mode: gpioled_default {
					snowball_cfg1 {
						pins = "GPIO142_C11";
						ste,config = <&gpio_out_hi>;
					};

				};
			};
			accelerometer {
				accel_snowball_mode: accel_snowball {
					/* Accelerometer lines */
					snowball_cfg1 {
						pins =
						"GPIO163_C20", /* ACCEL_IRQ1 */
						"GPIO164_B21"; /* ACCEL_IRQ2 */
						ste,config = <&gpio_in_pu>;
					};
				};
			};
			gyro {
				gyro_snowball_mode: gyro_snowball {
					snowball_cfg1 {
						pins =
						"GPIO166_A22", /* DRDY */
						"GPIO169_D22"; /* INT */
						ste,config = <&gpio_in_pu>;
					};
				};
			};
			magnetometer {
				magneto_snowball_mode: magneto_snowball {
					snowball_cfg1 {
						pins = "GPIO165_C21"; /* MAG_DRDY */
						ste,config = <&gpio_in_pu>;
					};
				};
			};
			gbf {
				gbf_snowball_mode: gbf_snowball {
					/*
					 * GBF (GPS, Bluetooth, FM-radio) interface,
					 * pull low to reset state
					 */
					snowball_cfg1 {
						pins = "GPIO171_D23"; /* GBF_ENA_RESET */
						ste,config = <&gpio_out_lo>;
					};
				 };
			};
			wlan {
				wlan_snowball_mode: wlan_snowball {
					/*
					 * Activate this mode with the WLAN chip.
					 * These are plain GPIO pins used by WLAN
					 */
					snowball_cfg1 {
						pins =
						"GPIO161_D21", /* WLAN_PMU_EN */
						"GPIO215_AH13"; /* WLAN_ENA */
						ste,config = <&gpio_out_lo>;
					};
					snowball_cfg2 {
						pins = "GPIO216_AG12"; /* WLAN_IRQ */
						ste,config = <&gpio_in_pu>;
					};
				};
			};
		};

		mcde@a0350000 {
			pinctrl-names = "default", "sleep";
			pinctrl-0 = <&lcd_default_mode>;
			pinctrl-1 = <&lcd_sleep_mode>;
		};
	};
};
